package vista;

import basedatos.CrearBaseDeDatos;
import basedatos.OperacionesBD;
import com.mysql.jdbc.CommunicationsException;
import java.awt.Image;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import modelo.Sistema;
import modulos.perfil.modelo.Perfil;
import modulos.usuario.modelo.AlgoritmoAES;
import modulos.usuario.modelo.Cuenta_Usuario;
import modulos.usuario.modelo.Enlace;
import modulos.usuario.modelo.Medicina;
import modulos.usuario.modelo.SerialMAC_AES;
import modulos.usuario.vista.VtnLicencia;
import modulos.usuario.vista.VtnSolicitarLicencia;
import propiedades.DialogConfigDatabase;
import propiedades.Propiedades;

/**
 *
 * @author Medikux
 */
public class ClsInicio {

    public static List<Object[]> currentUser = null;//
    public static Cuenta_Usuario eCuenta_Usuario = new Cuenta_Usuario();
    public static ArrayList<Object> perfiles;
    public static Image imagenFondo;
    public static Image imagenLogin;
    public static Perfil perfilActual;
    public static Properties prop;
    public static Medicina medicina;

    public static void main(String[] args) {

        for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(laf.getName())) {
                try {
                    UIManager.setLookAndFeel(laf.getClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
            }
        }
//        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
//        /*
//         * If Nimbus (introduced in Java SE 6) is not available, stay with the
//         * default look and feel. For details see
//         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
//         */
//        try {
//            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
//                if ("Nimbus".equals(info.getName())) {
//                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
//                    break;
//                }
//            }
//        } catch (ClassNotFoundException ex) {
//            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (InstantiationException ex) {
//            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (IllegalAccessException ex) {
//            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
//            java.util.logging.Logger.getLogger(frmPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        }
//        //</editor-fold>
        try {
            new Thread(new IfrmAbriendoApp()).start();
            prop = new Propiedades().getProperties("/propiedades/database.properties");
            CrearBaseDeDatos.conectado(prop.getProperty("clave"), prop.getProperty("user"), "dbMedicos", prop.getProperty("host"));
            iniciado = true;
            iniciAplicacion();
        } catch (Exception ex) {
            new DialogConfigDatabase(null, true).setVisible(true);
            Logger.getLogger(ClsInicio.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
    static boolean iniciado = false;

    public static void iniciAplicacion() {
        try {
            if (!iniciado) {
                prop = new Propiedades().getProperties("/propiedades/database.properties");
                CrearBaseDeDatos.conectado(prop.getProperty("clave"), prop.getProperty("user"), "dbMedicos", prop.getProperty("host"));
            }
            OperacionesBD.conectar(prop.getProperty("user"), prop.getProperty("clave"), prop.getProperty("host"));
            CrearBaseDeDatos.conectado(prop.getProperty("clave"), prop.getProperty("user"), "dbMedicos_config", prop.getProperty("host"));
            CrearBaseDeDatos.creaTablaMedicina();

            //ArrayList<Medicina> aux = (ArrayList<Medicina>) OperacionesBD.listar("Medicina");
            ArrayList<Medicina> aux = CrearBaseDeDatos.listar();
            if (aux.isEmpty()) {
                Medicina m = new Medicina();
                m.setEjecucion(0);
                m.setInicial(new Date());
                AlgoritmoAES aes = new AlgoritmoAES(VtnLicencia.SERIAL.getBytes());
                m.setMac(aes.encriptar(Enlace.getMac()));
                m.setSerial("");
                CrearBaseDeDatos.crearMedicina(m);
                //OperacionesBD.guardar(m);
            }
            ClsInicio inicio = new ClsInicio();

            inicio.comprobar();
        } catch (SQLException ex) {
            new DialogConfigDatabase(null, true).setVisible(true);
            Logger.getLogger(ClsInicio.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void logueandoUsuario() {
        currentUser = null;
        try {

            if (eCuenta_Usuario.preSetupUserManager() == 0)//Si hay 0 usuarios
            {
                if (eCuenta_Usuario.setupUserAdministrador() == false) {
                    JOptionPane.showMessageDialog(null, "Ha ocurido una excepción en la generación del Usuario Administrador", "Ingreso al sistema", JOptionPane.ERROR_MESSAGE);
                    return;
                }
            }

            ///////////////////////////////////////////////
            Sistema sistema = null;
            Sistema sys = new Sistema();
            sys.establecerConfiguracion();
            sistema = (Sistema) sys.selectConfiguracion();

            if (sistema != null) {

                if (sistema.getLoguear() == 0)//acceso abierto
                {
                    currentUser = eCuenta_Usuario.loginUsuarioDefault();
                    frmPrincipal frmP = new frmPrincipal(currentUser);
                    frmP.setVisible(true);
                } else//acceso con clave de usuario
                {
                    jFrmLogin frmAcceso = new jFrmLogin(null, true);
                    frmAcceso.setVisible(true);
                    currentUser = frmAcceso.uloged;
                    frmPrincipal frmP = new frmPrincipal(currentUser);
                    frmP.setVisible(true);
                }
            }
            if (currentUser == null) {
                System.exit(0);
            }
            if (currentUser.size() == 1) {
                for (Object[] o : currentUser) {
                    eCuenta_Usuario = (Cuenta_Usuario) o[0];//verificar si cambias variable eCuenta.....
                }
                //this.setTitle("Usuario: [" + eCuenta_Usuario.getNomUsuario() + "]");
                JOptionPane.showMessageDialog(null, "Bienvenido al sistema! \nUsted ha ingresado como usuario: '" + eCuenta_Usuario.getTipo() + "'", "Inicio de sesión...", JOptionPane.INFORMATION_MESSAGE);
                //restringirPermisosAcceso(eCuenta_Usuario.getTipo().trim());
            }
        } catch (Exception ex) {

            //JOptionPane.showMessageDialog(null, "Ha ocurrido la siguiente excepciónssss:\n\n" + ex.getMessage(), "Ingreso al sistema", JOptionPane.ERROR_MESSAGE);
            Logger.getLogger(ClsInicio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void ponePerfil() {
        listar();
        if (!perfiles.isEmpty()) {
            perfilActual = buscaHabilitado();
            imagenFondo = new ImageIcon(perfilActual.getImagenPantalla()).getImage();
            imagenLogin = new ImageIcon(perfilActual.getImagenInicio()).getImage();
        }
    }

    public static void listar() {
        perfiles = (ArrayList<Object>) OperacionesBD.listar("Perfil");
    }

    public static Perfil buscaHabilitado() {
        Perfil p = null;
        for (Object o : perfiles) {
            Perfil pr = (Perfil) o;
            if (pr.isSeleccionado()) {
                p = pr;
            }
        }
        return p;
    }

    public static void poneHabilitado(String nombrePerfil) {
        for (Object o : perfiles) {
            Perfil pr = (Perfil) o;
            if (nombrePerfil.equals(pr.getNombrePerfil())) {
                pr.setSeleccionado(true);
                OperacionesBD.modificar(pr);
            } else {
                pr.setSeleccionado(false);
                OperacionesBD.modificar(pr);
            }
        }
    }

    public static void comprobar() throws SQLException {
        //ArrayList<Medicina> aux = (ArrayList<Medicina>) OperacionesBD.listar("Medicina");
        ArrayList<Medicina> aux = CrearBaseDeDatos.listar();
        AlgoritmoAES alg = new AlgoritmoAES(VtnLicencia.SERIAL.getBytes());
        String mac = alg.encriptar(Enlace.getMac());
        medicina = hayMac(aux, mac);
        if (medicina != null) {
            if (medicina.getSerial().length() == 0) {
                if (calcularDias(medicina.getInicial()) < 7 && medicina.getEjecucion() < 6) {
                    medicina.setEjecucion(medicina.getEjecucion() + 1);
                    //OperacionesBD.modificar(medicina);
                    CrearBaseDeDatos.modificar(medicina);
                    new VtnSolicitarLicencia(null, true);
                } else {
                    new VtnLicencia(null, true);
                }
            } else {
                try {
                    if (medicina.getSerial().equalsIgnoreCase(alg.encriptar(SerialMAC_AES.generarSerial()))) {
                        ClsInicio.ponePerfil();
                        ClsInicio.logueandoUsuario();
                    } else {
                        if (calcularDias(medicina.getInicial()) < 7 && medicina.getEjecucion() < 5) {
                            medicina.setEjecucion(medicina.getEjecucion() + 1);
                            //OperacionesBD.modificar(medicina);
                            CrearBaseDeDatos.modificar(medicina);
                            new VtnSolicitarLicencia(null, false);
                        } else {
                            new VtnLicencia(null, true);
                        }
                    }
                } catch (Exception ex) {
                    Logger.getLogger(ClsInicio.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
//        Medicina medicina = aux.get(0);
//        if (medicina.getMac().length() == 0) {
//            if (calcularDias(medicina.getInicial()) < 7 && medicina.getEjecucion() < 6) {
//                medicina.setEjecucion(medicina.getEjecucion() + 1);
//                //OperacionesBD.modificar(medicina);
//                CrearBaseDeDatos.modificar(medicina);
//                new VtnSolicitarLicencia(null, true);
//            } else {
//                new VtnLicencia(null, true);
//            }
//        } else {
//            AlgoritmoAES alg = new AlgoritmoAES(VtnLicencia.SERIAL.getBytes());
//            try {
//                if (medicina.getMac().equalsIgnoreCase(alg.encriptar(Enlace.getMac()))) {
//                    ClsInicio.ponePerfil();
//                    ClsInicio.logueandoUsuario();
//                } else {
//                    if (calcularDias(medicina.getInicial()) < 7 && medicina.getEjecucion() < 5) {
//                        medicina.setEjecucion(medicina.getEjecucion() + 1);
//                        //OperacionesBD.modificar(medicina);
//                        CrearBaseDeDatos.modificar(medicina);
//                        new VtnSolicitarLicencia(null, false);
//                    } else {
//                        new VtnLicencia(null, true);
//                    }
//                }
//            } catch (Exception ex) {
//                Logger.getLogger(ClsInicio.class.getName()).log(Level.SEVERE, null, ex);
//            }
//        }
    }

    public static Medicina hayMac(ArrayList<Medicina> a, String mac) {
        Medicina aux = null;
        for (Medicina m : a) {
            if (m.getMac().equals(mac)) {
                aux = m;
            }
        }
        return aux;
    }

    private static int calcularDias(Date inicio) {
        Date d = new Date();
        SimpleDateFormat sdfDia = new SimpleDateFormat("dd");
        SimpleDateFormat sdfMes = new SimpleDateFormat("MM");
        SimpleDateFormat sdfAno = new SimpleDateFormat("yyyy");
        int a = Integer.parseInt(sdfAno.format(d)) - Integer.parseInt(sdfAno.format(inicio));
        int b = Integer.parseInt(sdfMes.format(d)) - Integer.parseInt(sdfMes.format(inicio));
        int c = Integer.parseInt(sdfDia.format(d)) - Integer.parseInt(sdfDia.format(inicio));

        if (b < 0) {
            a = a - 1;
            b = 12 + b;
        }

        if (c < 0) {
            b = b - 1;

            switch (Integer.parseInt(sdfMes.format(d))) {
                case 2:
                    int ano = Integer.parseInt(sdfAno.format(d));
                    if ((ano % 4 == 0) && ((ano % 100 != 0) || (ano % 400 == 0))) {
                        c = 29 + c;
                    } else {
                        c = 28 + c;
                    }
                    break;
                case 4:
                case 6:
                case 9:
                case 10:
                case 11:
                    c = 30 + c;
                    break;
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 12:
                    c = 31 + c;
                    break;
            }
        }
        if (b < 0) {
            a = a - 1;
            b = 12 + b;
        }
        int dias;
        dias = c + (b * 30) + (a * 365);

        return dias;
    }
//    private boolean existe(){
//        
//    }
}
